package br.com.simora.artista;

import java.util.ResourceBundle;

import javax.annotation.PostConstruct;
import javax.inject.Inject;

import br.com.caelum.vraptor.Controller;
import br.com.caelum.vraptor.Get;
import br.com.caelum.vraptor.Path;
import br.com.caelum.vraptor.Post;
import br.com.caelum.vraptor.Result;
import br.com.caelum.vraptor.view.Results;
import br.com.simora.controller.BasicController;
import br.com.simora.musica.Artista;
import br.com.simora.musica.ArtistaDAO;
import br.com.simora.musica.ArtistaNomeSinonimo;

@Controller
public class ArtistaController extends BasicController {
	@Inject private ArtistaDAO artistaDAO;
	
	public ArtistaController(Result result, ResourceBundle bundle,
			ArtistaDAO artistaDAO) {
    	this.result = result;
		this.bundle = bundle;
		this.artistaDAO = artistaDAO;
	}

    public ArtistaController(){}
    
	@PostConstruct
    public void init(){
        injetaUsuario();
    }
   
    @Path(value = "/" + ARTISTA)
    @Get
    public void artista() {
    	Integer totalArtistas = artistaDAO.recuperaTotalArtistas();
    	Integer totalPaginas = (totalArtistas/50);
    	result.include("totalArtistas", totalArtistas);
    	result.include("totalPaginas", totalPaginas);
        result.include("listaArtista", artistaDAO.recuperaArtistasOrdenadosPorNome(null));
    }
    
    @Path(value = "/" + ARTISTA + "/{pagina}")
    @Get
    public void artista(Integer pagina) {
    	Integer totalArtistas = artistaDAO.recuperaTotalArtistas();
    	Integer totalPaginas = (totalArtistas/50);
    	result.include("totalArtistas", totalArtistas);
    	result.include("totalPaginas", totalPaginas);
    	result.include("paginaAtual", pagina);
        result.include("listaArtista", artistaDAO.recuperaArtistasOrdenadosPorNome(pagina));
    }

    
    @Post
	public void gravar(Artista artista){
    	Artista temp = (Artista) artistaDAO.find(Artista.class, artista.getId());
    	String nomeAntigo = temp.getNome();
		temp.setNome(artista.getNome());
		artistaDAO.update(temp);
		ArtistaNomeSinonimo ans = new ArtistaNomeSinonimo();
		ans.setNome(nomeAntigo);
		ans.setArtista(temp);
		artistaDAO.save(ans);
		result.use(Results.json()).from(true, "retorno").serialize();
	}
    
    @Post
	public void fundir(Integer artistaFusaoId, Integer artistaNovoId){
    	Artista artistaFusao = (Artista) artistaDAO.find(Artista.class, artistaFusaoId);
    	Artista artistaNovo = (Artista) artistaDAO.find(Artista.class, artistaNovoId);
    	artistaNovo.getMusicas().addAll(artistaFusao.getMusicas());
    	artistaDAO.update(artistaNovo);
    	artistaDAO.remove(artistaFusao);
		result.use(Results.json()).from(true, "retorno").serialize();
	}
    
	@Override
	protected void redirect() {}
}
